package com.cucn.ingmall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.cucn.common.constant.product.ProductConstant;
import com.cucn.ingmall.product.dao.AttrAttrgroupRelationDao;
import com.cucn.ingmall.product.dao.AttrDao;
import com.cucn.ingmall.product.entity.AttrAttrgroupRelationEntity;
import com.cucn.ingmall.product.entity.AttrEntity;
import com.cucn.ingmall.product.service.AttrAttrgroupRelationService;
import com.cucn.ingmall.product.service.AttrService;
import com.cucn.ingmall.product.vo.AttrGroupRelationVO;
import com.cucn.ingmall.product.vo.AttrGroupWithAttrsVO;
import com.cucn.ingmall.product.vo.SkuItemVO;
import com.cucn.ingmall.product.vo.SpuItemAttrGroupVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cucn.common.utils.PageUtils;
import com.cucn.common.utils.Query;

import com.cucn.ingmall.product.dao.AttrGroupDao;
import com.cucn.ingmall.product.entity.AttrGroupEntity;
import com.cucn.ingmall.product.service.AttrGroupService;

import javax.annotation.Resource;


/**
 * 属性分组实现类
 *
 * @author kouchaojie
 * @email kou1688@foxmail.com
 * @date 2021-11-17 16:27:04
 */
@Service("attrGroupService")
public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupDao, AttrGroupEntity> implements AttrGroupService {

    @Autowired
    private AttrAttrgroupRelationDao relationDao;

    @Autowired
    private AttrService attrService;

    @Autowired
    private AttrAttrgroupRelationService relationService;
    @Resource
    private AttrGroupService attrGroupService;
    @Resource
    private AttrGroupDao attrGroupDao;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<AttrGroupEntity> page = this.page(
                new Query<AttrGroupEntity>().getPage(params),
                new QueryWrapper<AttrGroupEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * 通过分类id获取属性分组
     * 需要区分刚进入页面不带id查询全部与点击分类带id查询特定的分类
     *
     * @param params    请求参数
     * @param catelogId 三级分类id
     * @return 统一结果返回
     */
    @Override
    public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
        String key = (String) params.get("key");
        //模糊查询的条件值
        //select * from pms_attr_group where catelog_id=catelogId and **** or ****
        QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<>();
        //点击分类,查询具体数据
        if (!StringUtils.isEmpty(key)) {
            wrapper.and((obj) -> {
                obj.eq("attr_group_id", key).or().like("attr_group_name", key);
            });
        }

        //没有点击具体分类,查询全部数据
        if (catelogId == 0) {
            IPage<AttrGroupEntity> page = this.page(
                    new Query<AttrGroupEntity>().getPage(params),
                    wrapper);

            return new PageUtils(page);
        } else {
            //如果分类id不等于0,则查询具体分类的属性分组
            wrapper.eq("catelog_id", catelogId);
            IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params), wrapper);
            return new PageUtils(page);
        }
    }

    /**
     * 获取属性分组没有关联的其他属性
     * 可以关联的属性一定是对应分组所属的三级分类下的属性
     * 并且没有被本分类下其他分组关联的属性
     *
     * @param params      请求参数
     * @param attrgroupId 属性分组id
     * @return attrgroupId对应在对应分类下的没有关联的属性
     */
    @Override
    public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
        //1.当前分组只能关联自己所属分类里的所有属性
        //先查出分组所属的分类
        AttrGroupEntity attrGroupEntity = this.getById(attrgroupId);
        Long catelogId = attrGroupEntity.getCatelogId();

        //2.当前分组只能关联别的分组没有引用的属性
        //2.1找到当前分类下的其他分组
        List<AttrGroupEntity> groupEntityList = this.baseMapper.selectList(
                new QueryWrapper<AttrGroupEntity>()
                        .eq("catelog_id", catelogId)
        );
        List<Long> groupIdList = groupEntityList
                .stream()
                .map((group) -> group.getAttrGroupId())
                .collect(Collectors.toList());

        //2.2其他分组关联的属性
        List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(
                new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", groupIdList)
        );
        List<Long> attrIdList = relationEntities
                .stream()
                .map((relation) -> relation.getAttrId())
                .collect(Collectors.toList());

        //2.3从当前分类的所属属性中排除掉其他分组关联的属性
        //只查基本属性（规格参数），排除掉销售属性
        QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>()
                .eq("catelog_id", catelogId).eq("attr_type", ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
        //如果其他分类关联的属性不为空再拼装notIn
        if (!attrIdList.isEmpty()) {
            wrapper.notIn("attr_id", attrIdList);
        }

        //如果有条件查询
        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)) {
            wrapper.and((w) -> {
                w.eq("attr_id", key).or().like("attr_name", key);
            });
        }
        IPage<AttrEntity> page = attrService.page(new Query<AttrEntity>().getPage(params), wrapper);
        PageUtils pageUtils = new PageUtils(page);

        return pageUtils;
    }

    /**
     * 根据分类id查出所有分组&关联属性
     *
     * @param catelogId 分类id
     * @return 分类下所有分组&关联属性集合
     */
    @Override
    public List<AttrGroupWithAttrsVO> getAttrGroupWithAttrsByCatelogId(Long catelogId) {
        //查询分组信息
        List<AttrGroupEntity> groupList = this.list(
                new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId)
        );
        List<AttrGroupWithAttrsVO> attrGroupWithAttrsVOS = groupList
                .stream()
                .map((item) -> {
                    AttrGroupWithAttrsVO groupWithAttrsVO = new AttrGroupWithAttrsVO();
                    BeanUtils.copyProperties(item, groupWithAttrsVO);
                    //根据分组id查找关联的所有基本属性
                    List<AttrEntity> attrs = attrService.getRelationAttr(item.getAttrGroupId());
                    groupWithAttrsVO.setAttrs(attrs);
                    return groupWithAttrsVO;
                })
                .collect(Collectors.toList());

        return attrGroupWithAttrsVOS;
    }

    /**
     * 查出当前spu对应的所有属性的分组信息以及当前分组下的所有属性对应的值
     *
     * @param spuId spuId
     * @return spu的属性分组信息以及当前分组下的所有属性对应的值
     */
    @Override
    public List<SpuItemAttrGroupVO> getAttrGroupWithAttrsBySpuId(Long spuId, Long catalogId) {
        //1.当前spu有多少对应的属性分组  分组名  和每个分组下的所有属性名以及属性值
        List<SpuItemAttrGroupVO> attrGroupList = getByCatalogId(spuId,catalogId);

        return attrGroupList;
    }

    /**
     * 查出三级分类对应的所有属性分组信息
     *
     * @param catalogId
     * @return
     */
    private List<SpuItemAttrGroupVO> getByCatalogId(Long spuId,Long catalogId) {
        List<SpuItemAttrGroupVO> groupList = attrGroupDao.getByCatalogId(spuId,catalogId);
        return groupList;
    }
}